{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "12e742f3-5947-432b-b464-687ac2b2f6f0",
   "metadata": {},
   "source": [
    "思路：  \n",
    "1、数据读取、数据缺失值处理、标签数值化、数据标准化处理及数据集划分、数据集类别可视化  \n",
    "2、选取不同近邻个数，进行K近邻分类模型训练与测试、评价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "ac691f2f-e0cb-4746-88b8-27fd84b339e6",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import warnings\n",
    "\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "from sklearn.preprocessing import LabelEncoder  # 字符串型数据编码\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.model_selection import cross_val_score\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.metrics import roc_curve, auc\n",
    "from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score\n",
    "\n",
    "from matplotlib import rcParams\n",
    "import matplotlib\n",
    "# matplotlib.use(\"Agg\")  # 输出时不显示绘图\n",
    "import matplotlib.pyplot as plt  # matplotlib.use('agg')必须在本句执行前运行\n",
    "\n",
    "rcParams['font.family'] = 'simhei'  # 可以让图像中显示中文（黑体），无需引用\n",
    "rcParams['axes.unicode_minus'] = False  # 解决负数坐标显示问题\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "# #############################################################################################\n",
    "# 公共部分：分类模型评价体系evaluation\n",
    "# todo: 构建分类模型的评价体系并存储在evaluation中，方便对比查看，全局变量\n",
    "evaluation = pd.DataFrame({'Model': [],\n",
    "                           '准确率': [],\n",
    "                           '精确率': [],\n",
    "                           '召回率': [],\n",
    "                           'F1 值': [],\n",
    "                           'AUC值': [],\n",
    "                           '5折交叉验证的score': []})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "f0b36248-d91d-4506-9892-d99de84545b4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "             A11            A15\n",
      "count  690.00000     690.000000\n",
      "mean     2.40000    1017.385507\n",
      "std      4.86294    5210.102598\n",
      "min      0.00000       0.000000\n",
      "25%      0.00000       0.000000\n",
      "50%      0.00000       5.000000\n",
      "75%      3.00000     395.500000\n",
      "max     67.00000  100000.000000\n",
      "信用卡审批通过的数量： 307\n",
      "信用卡审批未通过的数量： 383\n"
     ]
    }
   ],
   "source": [
    "#1.1 读数据\n",
    "df = pd.read_csv('./data/crx.data',decimal=',',header=None)\n",
    "df.columns = ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7', 'A8', 'A9', 'A10',\n",
    "                'A11', 'A12', 'A13', 'A14', 'A15', 'Label']\n",
    "print(df.describe())\n",
    "print('信用卡审批通过的数量：', df[df['Label']=='+']['Label'].count())\n",
    "print('信用卡审批未通过的数量：', df[df['Label']=='-']['Label'].count())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "72ffe9b7-a180-4dac-a2b8-f4954fbdd1b6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "过滤后的数据条数: 653\n"
     ]
    }
   ],
   "source": [
    "#1.2 数据预处理，异常数据过滤\n",
    "df = df.replace('?',np.nan)\n",
    "df = df.dropna(how='any') #只有出现NAN，整行删除。\n",
    "print(\"过滤后的数据条数:\" , len(df))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "bee34ade-f7b3-40bc-814f-bf8aebc3f3a6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "过滤后信用卡审批通过的数量： 296\n",
      "过滤后信用卡审批未通过的数量： 357\n"
     ]
    }
   ],
   "source": [
    "print('过滤后信用卡审批通过的数量：', df[df['Label']=='+']['Label'].count())\n",
    "print('过滤后信用卡审批未通过的数量：', df[df['Label']=='-']['Label'].count())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ea33b205-bfdd-40e3-a2d5-084dc3467de1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "#1.3 将变量中含有字符的数据，使用LabelEncoder转换场数字\n",
    "X = df[df.columns[0:-1]]\n",
    "y = df[['Label']]\n",
    "le = LabelEncoder()\n",
    "X_data = []\n",
    "for i in range(X.shape[1]): \n",
    "    X_data.append(le.fit_transform(X.iloc[:,i]))\n",
    "y_data = le.fit_transform(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "e423aeda-0170-4fe8-bb52-5fd2bad42012",
   "metadata": {},
   "outputs": [],
   "source": [
    "#1.4 将输入的变量标准化\n",
    "min_max = MinMaxScaler()\n",
    "X_data = np.array(X_data).T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "e6814e36-7459-451c-84da-7514e149ce1a",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.        , 0.45132743, 0.        , ..., 0.        , 0.41717791,\n",
       "        0.        ],\n",
       "       [0.        , 0.94690265, 0.74528302, ..., 0.        , 0.06748466,\n",
       "        0.5       ],\n",
       "       [0.        , 0.25958702, 0.0754717 , ..., 0.        , 0.57668712,\n",
       "        0.5877193 ],\n",
       "       ...,\n",
       "       [0.        , 0.28318584, 0.4245283 , ..., 0.        , 0.41104294,\n",
       "        0.00438596],\n",
       "       [1.        , 0.05899705, 0.03301887, ..., 0.        , 0.57668712,\n",
       "        0.56578947],\n",
       "       [1.        , 0.56932153, 0.68396226, ..., 0.        , 0.        ,\n",
       "        0.        ]])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_data = min_max.fit_transform(X_data)\n",
    "X_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "c81f71e7-b46d-4ed4-b960-06e8c5995712",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 1.5 对数据进行划分\n",
    "train_size = 0.7\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_data,y_data,train_size=train_size,random_state=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e5508612-c0e0-43b6-a0a4-7c21c7859b53",
   "metadata": {},
   "source": [
    "### 步骤2 进行K近邻分类模型训练与测试、评价"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "213d1250-0e46-4486-9184-890b6812d354",
   "metadata": {},
   "outputs": [],
   "source": [
    "n_neighbors = 2\n",
    "model = KNeighborsClassifier(n_neighbors=n_neighbors)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "fed18039-d593-4a82-abd9-db7c7864d36d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 2.1 根据选择的模型进行训练，预测\n",
    "knn_model = model\n",
    "knn_model.fit(X_train,y_train)\n",
    "y_test_predict = knn_model.predict(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "62408784-4476-4ee1-b1bb-9a1ae5ff4e17",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0,\n",
       "       1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1,\n",
       "       1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0,\n",
       "       0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0,\n",
       "       0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1,\n",
       "       0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1,\n",
       "       0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1,\n",
       "       1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0,\n",
       "       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0])"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test_predict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "6348bdd1-7a79-4c31-964d-4b6475da3003",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0,\n",
       "       1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0,\n",
       "       1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0,\n",
       "       0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1,\n",
       "       0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 1,\n",
       "       0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1,\n",
       "       0, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1,\n",
       "       1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0,\n",
       "       1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_test"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "cf174875-af17-4404-a0b4-9c3a23d714cc",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 步骤2.2 todo: 计算分类评价指标：测试集的准确率accuracy、精确率precision、召回率recall和综合评价指标 F1 值\n",
    "# 精确率是指分类器预测出的正例中真的是正例的比例\n",
    "# 召回率是所有真的正例被分类器正确找出来的比例\n",
    "# F1 值是精确率和召回率的调和均值\n",
    "acc_test = accuracy_score(y_test, y_test_predict)\n",
    "precision_test = precision_score(y_test, y_test_predict)\n",
    "recall_test = recall_score(y_test, y_test_predict)\n",
    "f1score_test = f1_score(y_test, y_test_predict)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "fba75f29-27b7-49fc-ad22-b3d5dff29752",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 步骤2.3 todo: 绘制ROC曲线，计算auc，度量分类模型的预测能力\n",
    "# ROC曲线以召回率为纵轴，以假正例率为横轴，ROC曲线下的面积为AUC值\n",
    "y_test_predict_proba = knn_model.predict_proba(X_test)\n",
    "false_positive_rate, recall, thresholds = roc_curve(y_test, y_test_predict_proba[:, 1])\n",
    "roc_auc = auc(false_positive_rate, recall)  # 计算auc的值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "0d850674-5ebc-479e-8c73-ef68cb3f629d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()\n",
    "plt.title('KNN分类模型(%d 个近邻)的 ROC-AUC 图' % n_neighbors)\n",
    "plt.plot(false_positive_rate, recall, 'r', label='AUC = %0.3f' % roc_auc)\n",
    "plt.legend(loc='best')\n",
    "plt.plot([0, 1], [0, 1], 'k--')\n",
    "plt.xlim([0.0, 1.0])\n",
    "plt.ylim([0.0, 1.0])\n",
    "plt.ylabel('真正例率(召回率)')\n",
    "plt.xlabel('假正例率')\n",
    "plt.savefig('./results/ROC_AUC_KNN_with_{}_neighbors.png'.format(n_neighbors))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4ad2a52a-056b-47b2-8003-de95d2801ff2",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
